"""
错误处理能力
提供错误处理和重试的能力接口
"""
from typing import Optional, Type, Dict, Any, Callable, TypeVar

from .base import Capability, register_capability
from ..core.exceptions import LLMException, ProviderError
from ..utils.errors.handling import error_context, safe_execute
from ..utils.retry.backoff import retry_with_backoff

# 定义泛型返回类型
T = TypeVar('T')

@register_capability("error_handling")
class ErrorHandlingCapability(Capability):
	"""错误处理能力"""
	
	def is_supported(self) -> bool:
		"""所有提供商都支持错误处理"""
		return True
	
	def handle_error(self, error: Exception, operation: Optional[str] = None) -> ProviderError:
		"""
		处理错误并转换为标准错误
		
		Args:
			error: 原始错误
			operation: 操作描述（用于日志）
			
		Returns:
			标准化的ProviderError
		"""
		from ..utils.errors.mapping import map_error_from_provider
		
		if not isinstance(error, LLMException):
			provider_type = getattr(self._provider, 'provider_type', 'unknown')
			model = getattr(self._provider, 'model', None)
			mapped_error = map_error_from_provider(provider_type, error, model)
			
			# 记录错误日志
			if operation:
				from ..core.logging import get_logger
				logger = get_logger("connllm")
				logger.error(f"{operation} 失败: {str(mapped_error)}")
				
			return mapped_error
		
		return error if isinstance(error, ProviderError) else ProviderError(
			str(error), getattr(self._provider, 'provider_type', 'unknown'), 
			getattr(self._provider, 'model', None)
		)
	
	def retry_operation(self, func: Callable[..., T], *args, **kwargs) -> T:
		"""
		带重试的执行操作
		
		Args:
			func: 要执行的函数
			*args: 函数位置参数
			**kwargs: 函数关键字参数
			
		Returns:
			函数返回值
			
		Raises:
			Exception: 如果所有重试都失败
		"""
		provider_type = getattr(self._provider, 'provider_type', 'unknown')
		model = getattr(self._provider, 'model', None)
		
		return retry_with_backoff(func, provider_type, model, *args, **kwargs)
	
	def with_error_context(self, operation: Optional[str] = None):
		"""
		获取错误上下文管理器
		
		Args:
			operation: 操作描述（用于日志）
			
		Returns:
			上下文管理器
		"""
		provider_type = getattr(self._provider, 'provider_type', 'unknown')
		model = getattr(self._provider, 'model', None)
		
		return error_context(provider_type, model, operation)
	
	def execute_safely(self, func: Callable[..., T], default: Any = None, 
					 log_error: bool = True, operation: Optional[str] = None, 
					 *args, **kwargs) -> T:
		"""
		安全执行函数，出错时返回默认值
		
		Args:
			func: 要执行的函数
			default: 出错时返回的默认值
			log_error: 是否记录错误日志
			operation: 操作描述（用于日志）
			*args: 函数位置参数
			**kwargs: 函数关键字参数
			
		Returns:
			函数返回值或默认值
		"""
		provider_type = getattr(self._provider, 'provider_type', 'unknown')
		model = getattr(self._provider, 'model', None)
		
		return safe_execute(
			func, provider_type, model, default, log_error, operation, *args, **kwargs
		)
